package com.tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1. TCP 服务器端
 */
public class SocketTCP03Server {

    public static void main(String[] args) throws IOException {
        // 1. 在本机中监听 9999 端口
        // 要求本机上，没有其他服务监听 9999 端口
        // 细节：这个 ServerSocket 可以通过 accept()返回多个 socket【多个客户端来连接服务器的并发】,
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器端监听9999端口，等待链接.......");
        // 2. 当没有客户端链接9999端口时，程序会阻塞
        // 如果有客户端链接了，则会返回一个socket对象，然后程序往下执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端 socket = " + socket.getClass());
        System.out.println("客户端已经链接了.........");

        // 3. 通过字符流，读取数据
        InputStream inputStream = socket.getInputStream();
        // 3.1 将字节输入流，转换成 字符输入流
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String s = bufferedReader.readLine();
        System.out.println(s);


        // 4. 向客户端发送数据
        OutputStream outputStream = socket.getOutputStream();
        // 2.1 将字节输出流，转换成字符输出流
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        // 2.2
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("hello client 字符流");
        bufferedWriter.newLine(); // 设置结束符
        bufferedWriter.flush();// 如果使用字符流发送数据的话，那么需要我们手动的刷新，否则数据不会写入到通道中
        System.out.println("客户端数据发送完毕.......");


        // 5. 读取数据之后，服务器端必须关闭流
        inputStream.close();
        outputStream.close();
        socket.close();
        serverSocket.close();
    }
}
